#include"mycommond.h"

//只考虑r w a 三种
//且是已存在的文件
_FILE *_fopen(char* filename,char*flags)
{
    int mode=0;
    if(strcmp(flags,"r")==0)
    {
        mode=O_RDONLY;
    } 
    else if(strcmp(flags,"w")==0)
    {
        mode=O_WRONLY|O_TRUNC;
    } 
    else if(strcmp(flags,"a")==0)
    {
        mode=O_WRONLY|O_APPEND;
    }
    else
    {
        return NULL;
    }
   int fd= open(filename,mode);
   if(fd==-1)
       return NULL;
   _FILE*p=(_FILE*)malloc(sizeof(_FILE));
   
   if(p==NULL) 
       return NULL;  
//  p->flash=FLASH_LINE;
//   p->flash=FLASH_C;
p->flash=FLASH_ALL;
   p->fileno=fd;
   p->size=0;
   return p;
}

size_t _fwrite(char*ptr,size_t size,size_t nmemb,_FILE*fp)
{
    memcpy(&fp->buffer[fp->size],ptr,size*nmemb);
    fp->size+=size*nmemb;
    if(fp->flash==FLASH_LINE)
    {
        if(fp->buffer[fp->size-1]=='\n')
        {
        write(fp->fileno,fp->buffer,size*nmemb);
        fp->size=0;
        }
    }
    else if(fp->flash==FLASH_C)
    {
            write(fp->fileno,fp->buffer,size*nmemb);
            fp->size=0;
    }   
    else
    {
        if(fp->size==1024)
        {         
            write(fp->fileno,fp->buffer,size*nmemb);
            fp->size=0;
        }
    }
    return size*nmemb;
}

void _fflush(_FILE*fp)
{
    if(fp->size>0)
    {
    write(fp->fileno,fp->buffer,fp->size);
    fp->size=0;
    }
}



void _fclose(_FILE*fp)
{
    if(fp==NULL) return;
   _fflush(fp);
    close(fp->fileno);
   free(fp); 
}



